home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / maximus / stbar20.zip / STARBAR.MEX < prev    next >
Text File  |  1996-04-11  |  21KB  |  808 lines

  1. ///////////////////////////////////////////////////////////////////////////
  2. //
  3. // StarBar V2.00 (!)1996 Larry Monte / StarLab Systems SoftWare
  4. //
  5. // MEX: Copyright 1990, 1995 by Lanius Corporation.  All rights reserved.
  6. //
  7.  
  8. #define INCL_starbar
  9.  
  10. #include <max.mh>
  11. #include <starbar.mh>
  12. #include <language.mh>
  13.  
  14. struct _ffind: ff;      // Struct for raw file info
  15.  
  16. struct _fileinfo        // Struct for holding file info
  17. {
  18.   string: fname;
  19.   string: size;
  20.   string: date;
  21.   string: description;
  22.   string: tagged;
  23. };
  24.  
  25. array [1..60] of struct _fileinfo: finfo;  // Maximum 60 lines per page
  26.  
  27. int: command_line;
  28. char: nonstop;
  29.  
  30. void no_access(ref int: pageno)            // No Access to TAG/DL function
  31. {                                          // notice...
  32.   print(AVATAR_CLS+str_st_no_access);
  33.   menu_cmd(106,"");
  34.   pageno := pageno -1;
  35. }
  36.  
  37. void low_light(int: count)       // Remove LightBar
  38. {
  39.   print(AVATAR_GOTO,(char)(count),(char)1);
  40.   print(LO_FILENAME+ strpad(finfo[count].fname,14,' '));
  41.   print(LO_FILESIZE+ finfo[count].size+" ");
  42.   print(LO_FILEDATE+ finfo[count].date);
  43. }
  44.  
  45. void high_light(int: count)     // Place LightBar
  46. {
  47.   print(AVATAR_GOTO,(char)(count),(char)1);
  48.   print(HI_FILENAME+ strpad(finfo[count].fname,14,' '));
  49. #ifdef HILIGHT_ALL
  50.   print(HI_FILESIZE+ finfo[count].size+" ");
  51.   print(HI_FILEDATE+ finfo[count].date);
  52. #endif
  53. }
  54.  
  55. void clear_status()             // Clear status lines
  56. {
  57.   print(AVATAR_GOTO,(char)(MAX_LINES-3),(char)1);
  58.   print(AVATAR_CLEOL+"\n"+AVATAR_CLEOL);
  59. }
  60.  
  61. void cleanup()                  // Clear out work dir
  62. {
  63.   if(filefindfirst(ff,STARBAR_PATH+"temp"+this_task+"\\*.*",FA_NORMAL))
  64.   {
  65.     do
  66.     {
  67.       remove(STARBAR_PATH+"temp"+this_task+"\\"+ff.filename);
  68.     }
  69.     while(filefindnext(ff));
  70.     filefindclose(ff);
  71.   }
  72. }
  73.  
  74. void do_footer()                // Print command footer
  75. {
  76.   string: line, area;
  77.  
  78.   area := COL_BLUE+"─┤"+COL_LCYAN+str_st_version+COL_BLUE+"├─"+
  79.           COL_LBLUE+"Area:"+COL_GREEN+"<"+COL_YELLOW+farea.name+
  80.           COL_GREEN+"> "+COL_LCYAN+substr(farea.descript,1,44)+COL_BLUE;
  81.   line := strpad(area,106,'─');
  82.   print(AVATAR_GOTO,(char)(MAX_LINES-3),(char)1,str_st_com_help);
  83.   print("\n\n"+substr(line,1,106)+"\n");
  84.   if(command_line = 0)
  85.   {
  86.     print(ST_LBRACKET+substr(KEY_EXIT,1,1)+ST_RBRACKET+str_st_com_exit+
  87.           ST_LBRACKET+KEY_DOWN+ST_RBRACKET+str_st_com_down+
  88.           ST_LBRACKET+KEY_UP+ST_RBRACKET+str_st_com_up+
  89.           ST_LBRACKET+KEY_PGDN+ST_RBRACKET+str_st_com_pgdn+
  90.           ST_LBRACKET+KEY_PGUP+ST_RBRACKET+str_st_com_pgup+
  91.           ST_LBRACKET+KEY_TAG+ST_RBRACKET+str_st_com_tag+
  92.           ST_LBRACKET+KEY_DL_CURR+ST_RBRACKET+
  93.           ST_LBRACKET+substr(KEY_DL_TAG,1,1)+ST_RBRACKET+
  94.           ST_LBRACKET+substr(KEY_VIEW,1,1)+ST_RBRACKET+
  95.           ST_LBRACKET+substr(KEY_LIST,1,1)+ST_RBRACKET);
  96.     command_line := 1;
  97.   }
  98.   else
  99.   {
  100.     print(ST_LBRACKET+KEY_DL_CURR+ST_RBRACKET+str_st_com_dl_curr+
  101.           ST_LBRACKET+substr(KEY_DL_TAG,1,1)+ST_RBRACKET+str_st_com_dl_tag+
  102.           ST_LBRACKET+substr(KEY_VIEW,1,1)+ST_RBRACKET+str_st_com_view+
  103.           ST_LBRACKET+substr(KEY_LIST,1,1)+ST_RBRACKET+str_st_com_list);
  104.     command_line := 0;
  105.   }
  106. }
  107.  
  108. int check_tag(int: count, ref int: que)     // See if file is tagged
  109. {
  110.   int: times, flags;
  111.   string: filescheck;
  112.  
  113.   for(times:=que+1;times>-1;times:=times-1)
  114.   {
  115.     tag_get_name(que,flags,filescheck);
  116.     if(strfind(filescheck,finfo[count].fname)>0)
  117.       return 1;
  118.     que := que -1;
  119.   }
  120.   return 0;
  121. }
  122.  
  123.  
  124. void do_help(ref int: pageno, ref int: count)      // Display help
  125. {
  126.   if(fileexists(STARBAR_PATH+"sbhelp"+uitostr(usr.lang)+".bbs"))
  127.     display_file(STARBAR_PATH+"sbhelp"+uitostr(usr.lang),nonstop);
  128.   else
  129.     display_file(STARBAR_PATH+"sbhelp0",nonstop);
  130.   count := 1;
  131.   pageno := pageno -1;
  132. }
  133.  
  134. void do_pgup(ref int: pageno)
  135. {
  136.   if(pageno > 2)
  137.     pageno := pageno -2;
  138.   return;
  139. }
  140.  
  141. int do_down(long: page_value, ref int: pageno, ref int: count,
  142.             long: dat_file_size)
  143. {
  144.   if(count < (MAX_LINES-3))
  145.   {
  146.     low_light(count);
  147.     count := count +1;
  148.     while(finfo[count].fname = "" AND MAX_LINES-3 > count)
  149.       count := count +1;
  150.     if(MAX_LINES-3 = count)
  151.     {
  152.       if(page_value = dat_file_size)
  153.       {
  154.         while(finfo[count].fname = "")
  155.           count := count -1;
  156.         high_light(count);
  157.         return 0;
  158.       }
  159.       return 1;
  160.     }
  161.     if(finfo[count].fname = "")
  162.     {
  163.       count := count -1;
  164.       high_light(count);
  165.     }
  166.     else
  167.       high_light(count);
  168.   }
  169.   return 0;
  170. }
  171.  
  172. int do_up(ref int: pageno, ref int: count)
  173. {
  174.   if(pageno > 1)
  175.   {
  176.     if(count <= 1 AND pageno > 2)
  177.     {
  178.       count := 1;
  179.       pageno := pageno -2;
  180.       return 1;
  181.     }
  182.     if(pageno >=2 AND count > 1)
  183.     {
  184.       low_light(count);
  185.       count := count -1;
  186.       while(finfo[count].fname = "")
  187.         count := count -1;
  188.       if (count <= 1)
  189.         count := 1;
  190.       high_light(count);
  191.     }
  192.   }
  193.   return 0;
  194. }
  195.  
  196. int do_tag(ref int: pageno, int: count)     // Tag/DeTag functions
  197. {
  198.   int: que, quelim;
  199.  
  200.   if(privok(ACCESS) = FALSE)
  201.   {
  202.     no_access(pageno);
  203.     return 1;
  204.   }
  205.   que := tag_queue_size()-1;
  206.   quelim := que;
  207.   if(que >= 0)
  208.   {
  209.     if(check_tag(count,que)=1)
  210.     {
  211.       tag_dequeue_file(que);
  212.       finfo[count].tagged := " ";
  213.       print(AVATAR_GOTO,(char)count,(char)32, finfo[count].tagged);
  214.       clear_status();
  215.       print(COL_WHITE+finfo[count].fname+str_st_deque);
  216.       return 0;
  217.     }
  218.   }
  219.   if(quelim >= 30)
  220.   {
  221.     print(AVATAR_CLS+str_st_tag_limit);
  222.     menu_cmd(106,"");
  223.     pageno := pageno -1;
  224.     return 1;
  225.   }
  226.   clear_status();
  227.   print(AVATAR_GOTO,(char)(MAX_LINES-4),(char)1);
  228.   input := "A;"+finfo[count].fname;
  229.   menu_cmd(512,"");
  230.   que := tag_queue_size() -1;
  231.   if(check_tag(count,que)=1)
  232.   {
  233.     finfo[count].tagged := ST_TAG;
  234.     print(AVATAR_GOTO,(char)count,(char)32, finfo[count].tagged);
  235.   }
  236.   return 0;
  237. }
  238.  
  239. void do_list(ref int: pageno, ref int: count)       // List/Edit Tagged files
  240. {
  241.   if(privok(ACCESS) = FALSE)
  242.   {
  243.     no_access(pageno);
  244.     return;
  245.   }
  246.   input := "L;";
  247.   print(AVATAR_CLS);
  248.   menu_cmd(512,"");
  249.   count := 1;
  250.   pageno := pageno -1;
  251.   return;
  252. }
  253.  
  254. int do_download(ref int: pageno, ref int: count, int: ch)
  255. {
  256.   int: checkdl;
  257.  
  258. #ifdef DO_LOCAL_DL
  259.  
  260.   int: qsize, fnum, ok, flags, pos;
  261.   string: filescheck, rootname, added_filename, new_path, out_path;
  262.  
  263. #endif
  264.  
  265.   if(privok(ACCESS) = FALSE)
  266.   {
  267.     no_access(pageno);
  268.     return 0;
  269.   }
  270.   print(AVATAR_CLS);
  271.   if(ch = '\r')
  272.   {
  273.     if(finfo[count].size = str_st_file_offline1)
  274.     {
  275.       print(COL_YELLOW+finfo[count].fname+str_st_file_offline2);
  276.       menu_cmd(106,"");
  277.       pageno := pageno -1;
  278.       return 0;
  279.     }
  280.     if(strfind(finfo[count].tagged, "+")=0)
  281.  
  282.     {
  283.       print(str_st_include_enter+finfo[count].fname);
  284.       print(str_st_include_dl);
  285.       checkdl := input_list("|NY",0,"","","");
  286.       if(checkdl = 'Y')
  287.       {
  288.         input := "A;"+finfo[count].fname;
  289.         menu_cmd(512,"");
  290.       }
  291.       if(checkdl = 'N' OR checkdl = '|' AND tag_queue_size()<=0)
  292.       {
  293.         print(AVATAR_CLS);
  294.         return 1;
  295.       }
  296.     }
  297.   }
  298.   if(usr.help < 6)
  299.   {
  300.     print(str_st_cont_dl+str_st_cancel_dl+str_st_edit_dl);
  301.   }
  302.  
  303. #ifdef DO_LOCAL_DL
  304.  
  305.   if (id.local = TRUE)
  306.   {
  307.     while (ok = 0)
  308.     {
  309.       qsize := (tag_queue_size());
  310.       print(str_st_dlf,qsize+1,str_st_dlf_end);
  311.       input_str(added_filename, INPUT_WORD,0,12,"");
  312.       if (added_filename <> "" AND added_filename <> "/q")
  313.       {
  314.         input := "A;"+added_filename;
  315.         menu_cmd(512,"");
  316.       }
  317.       else if (tag_queue_size() > 0 AND added_filename <> "/q")
  318.       {
  319.         print(str_st_alt_path);
  320.         input_str(new_path,INPUT_WORD,0,80,"");
  321.         if (new_path <> "")
  322.           out_path := new_path;
  323.         else
  324.           out_path := LOCAL_DL_PATH;
  325.         qsize := (tag_queue_size());
  326.         for (fnum := 0; fnum < qsize; fnum := fnum +1)
  327.         {
  328.           tag_get_name( fnum, flags, filescheck);
  329.           pos := strridx(filescheck, 0, '\\');
  330.           if (pos=0)
  331.             rootname := filescheck;
  332.           else
  333.             rootname := substr(filescheck, pos+1, strlen(filescheck)-pos+1);
  334.           filecopy(filescheck,out_path+rootname);
  335.         }
  336.         input := "C;|";
  337.         menu_cmd(512,"");
  338.         ok := 1;
  339.       }
  340.       else
  341.         ok := 1;
  342.     }
  343.   }
  344.   else
  345.  
  346. #endif
  347.  
  348.   menu_cmd(505,"");
  349.   return 1;
  350. }
  351.  
  352. #ifdef DO_VIEW
  353.  
  354. int do_see_txt(string: work_path)        // For examining files within the
  355. {                                        // archive
  356.   int: file_index, in_num, see_more;
  357.   string: in;
  358.   array [1..100] of string: arc_fname;
  359.  
  360.   file_index := 0;
  361.   reset_more(nonstop);
  362.  
  363.   print(AVATAR_CLS,str_st_file_hdr);
  364.   if(filefindfirst(ff,work_path+"\\*.*",FA_NORMAL))
  365.   {
  366.     do
  367.     {
  368.       if(strfind(ff.filename,".DOC") OR strfind(ff.filename,".TXT") OR
  369.          strfind(ff.filename,".PRN") OR (strfind(ff.filename,"READ") AND
  370.          strfind(ff.filename,"ME")))
  371.       {
  372.         file_index := file_index +1;
  373.         arc_fname[file_index] := ff.filename;
  374.         print(COL_LBLUE, file_index, "   -   "+COL_YELLOW+
  375.               strpad(arc_fname[file_index],14,' ')+
  376.               COL_GREEN+longpadleft(ff.filesize,9,' ')+"\n");
  377.       }
  378.     }
  379.     while(filefindnext(ff) AND do_more(nonstop,COL_CYAN));
  380.     filefindclose(ff);
  381.   }
  382.   if(file_index = 0)
  383.   {
  384.     print(str_st_no_files);
  385.     menu_cmd(106,"");
  386.     return 0;
  387.   }
  388.   print(str_st_see_cont);
  389.   input_str(in,INPUT_NLB_LINE,0,3,"");
  390.   in_num := strtoi(in);
  391.   if(in_num <> 0)
  392.   {
  393.     print(AVATAR_CLS);
  394.     display_file(work_path+"\\"+arc_fname[in_num],nonstop);
  395.     see_more := input_list("YN",0,"","",str_st_see_another);
  396.     if(see_more = 'y' OR see_more = 'Y')
  397.       return 1;
  398.   }
  399.   return 0;
  400. }
  401.  
  402. void do_desc(int: count, ref int: pageno)    // FILE_ID.DIZ/SDN.ID grabbing
  403. {                                            // routine
  404.   int: again, pos, i;
  405.   char: see_txt;
  406.   string: work_path, temp_desc_line, desc_line;
  407.  
  408.   work_path := STARBAR_PATH+"temp"+this_task;
  409.  
  410.   print(AVATAR_CLS+str_st_hold_on);
  411.   cleanup();
  412.   filecopy(farea.downpath+finfo[count].fname, work_path+"\\"+finfo[count].fname);
  413.  
  414. #ifdef DOS
  415.  
  416.   shell(IOUTSIDE_DOS|IOUTSIDE_REREAD, STARBAR_PATH+"getdesc.bat "+
  417.         work_path+" "+work_path+"\\"+finfo[count].fname);
  418.  
  419. #endif
  420. #ifdef OS2
  421.  
  422.   shell(IOUTSIDE_DOS|IOUTSIDE_REREAD, STARBAR_PATH+"getdesc.cmd "+
  423.         work_path+" "+work_path+"\\"+finfo[count].fname);
  424.  
  425. #endif
  426.  
  427.   if(fileexists(work_path+"\\descfile.txt")=True)
  428.   {
  429.     display_file(work_path+"\\descfile.txt",nonstop);
  430.   }
  431.   else                                        // No descriptor file, so
  432.   {                                           // expand FILES.BBS desc
  433.     print(str_st_no_desc);
  434.   pos := 1;
  435.   if(strlen(finfo[count].description) > 79)
  436.   {
  437.     do
  438.     {
  439.       temp_desc_line := substr(finfo[count].description,pos,79);
  440.       i := strlen(temp_desc_line);
  441.       if(i = 79)
  442.       {
  443.       while(temp_desc_line[i] <> ' ' )
  444.         i := i -1;
  445.       }
  446.       desc_line := substr(temp_desc_line,1, i-1);
  447.       print(ST_COL_DESC+desc_line+"\n");
  448.       pos := pos + (strlen(desc_line)+1);
  449.     }
  450.     while(pos < strlen(finfo[count].description));
  451.   }
  452.   else
  453.     print(ST_COL_DESC+finfo[count].description, "\n\n");
  454.   }
  455.   if(finfo[count].size = str_st_file_offline1)
  456.   {
  457.     menu_cmd(106,"");
  458.     pageno := pageno -1;
  459.     return;
  460.   }
  461.   see_txt := input_list("|NY",0,"","",str_st_exam);
  462.   if(see_txt = 'y' OR see_txt = 'Y')
  463.   {
  464.     print(AVATAR_CLS,str_st_hold_on);
  465.  
  466. #ifdef DOS
  467.  
  468.     shell(IOUTSIDE_DOS|IOUTSIDE_REREAD, STARBAR_PATH+"content.bat "+
  469.           work_path+" "+work_path+"\\"+finfo[count].fname);
  470.  
  471. #endif
  472. #ifdef OS2
  473.  
  474.     shell(IOUTSIDE_DOS|IOUTSIDE_REREAD, STARBAR_PATH+"content.cmd "+
  475.           work_path+" "+work_path+"\\"+finfo[count].fname);
  476.  
  477. #endif
  478.  
  479.     while(again := do_see_txt(work_path)=1){}
  480.   }
  481.   cleanup();
  482.   if(pageno > 1)
  483.     pageno := pageno -1;
  484.   return;
  485. }
  486.  
  487. #endif
  488.  
  489. #ifndef DO_VIEW
  490.  
  491. void do_desc(int: count, ref int: pageno)    // If external View options are
  492. {                                            // disabled, expand FILES.BBS
  493.   int: i, pos;                               // description
  494.   string: temp_desc_line, desc_line;
  495.  
  496.   print(AVATAR_CLS+"                              "+str_st_com_view+"\n\n");
  497.  
  498.   pos := 1;
  499.   if(strlen(finfo[count].description) > 79)
  500.   {
  501.     do
  502.     {
  503.       temp_desc_line := substr(finfo[count].description,pos,79);
  504.       i := strlen(temp_desc_line);
  505.       if(i = 79)
  506.       {
  507.       while(temp_desc_line[i] <> ' ' )
  508.         i := i -1;
  509.       }
  510.       desc_line := substr(temp_desc_line,1, i-1);
  511.       print(ST_COL_DESC+desc_line+"\n");
  512.       pos := pos + (strlen(desc_line)+1);
  513.     }
  514.     while(pos < strlen(finfo[count].description));
  515.   }
  516.   else
  517.     print(ST_COL_DESC+finfo[count].description, "\n\n");
  518.   menu_cmd(106,"");
  519.   pageno := pageno -1;
  520. }
  521.  
  522. #endif
  523.  
  524. int get_input(long: page_value, ref int: pageno, ref int: count,
  525.               long: dat_file_size)
  526. {
  527.   int: ok, i_key;
  528.   int: ch;
  529.                                         // Input routines
  530.   ok := 0;
  531.   i_key := 0;
  532.   while(ok = 0)
  533.   {
  534.     print(AVATAR_GOTO, (char)(MAX_LINES-3),(char)70,
  535.           ST_COL_INVISIBLE+AVATAR_CLEOL);
  536.     ch := xgetch();
  537.     if(stridx(KEY_EXIT,1,(char)ch)>0) return 1;
  538.     else if(ch = '?')
  539.     {
  540.       do_help(pageno,count);
  541.       return 0;
  542.     }
  543.     else if(ch = '3' OR ch = 81 OR ch = 77)
  544.     {
  545.       if(page_value = dat_file_size)
  546.         i_key := i_key -1;
  547.       else
  548.         return 0;
  549.     }
  550.     else if(ch = '9' OR ch = 73 OR ch = 75)
  551.     {
  552.       if(pageno = 2)
  553.         i_key := i_key -1;
  554.       else
  555.       {
  556.         do_pgup(pageno);
  557.         return 0;
  558.       }
  559.     }
  560.     else if(ch = '2' OR ch = 80)
  561.     {
  562.       if(do_down(page_value,pageno,count,dat_file_size)=1)
  563.         return 0;
  564.       i_key := i_key -1;
  565.     }
  566.     else if(ch = '8' OR ch = 72)
  567.     {
  568.       if(do_up(pageno,count)=1)
  569.         return 0;
  570.       i_key := i_key -1;
  571.     }
  572.     else if(ch = ' ')
  573.     {
  574.       if(do_tag(pageno,count)=1)
  575.         return 0;
  576.       i_key := i_key -1;
  577.     }
  578.     else if(stridx(KEY_LIST,1,(char)ch)>0)
  579.     {
  580.       do_list(pageno,count);
  581.       return 0;
  582.     }
  583.     else if(stridx(KEY_DL_TAG,1,(char)ch)>0 OR ch = '\r')
  584.     {
  585.       if(do_download(pageno,count,ch)=1)
  586.         return 1;
  587.       return 0;
  588.     }
  589.     else if(stridx(KEY_VIEW,1,(char)ch)>0)
  590.     {
  591.       do_desc(count,pageno);
  592.       return 0;
  593.     }
  594.     else
  595.     {
  596.       i_key := i_key +1;
  597.       if(i_key = 3)
  598.       {
  599.        do_help(pageno,count);
  600.        return 0;
  601.       }
  602.     }
  603.   }
  604. }
  605.  
  606. int fopen(ref int:  dmp_file,            // Open *.DAT/*.DMP files
  607.           ref int:  dat_file,
  608.           ref long: dat_file_size)
  609. {
  610.   string: files_info_path;
  611.  
  612.   if(farea.filesbbs > "")
  613.     files_info_path := substr(farea.filesbbs,1,stridx
  614.                              (farea.filesbbs,0,'.')-1);
  615.   else
  616.     files_info_path := farea.downpath + "files";
  617.  
  618.   dmp_file := open(files_info_path + ".dmp", IOPEN_READ|IOPEN_BINARY);
  619.   if (dmp_file < 0) return(dmp_file);
  620.  
  621.   dat_file_size := filesize(files_info_path + ".dat");
  622.   dat_file := open(files_info_path + ".dat", IOPEN_READ|IOPEN_BINARY);
  623.   if (dat_file < 0)
  624.   {
  625.     return(dat_file);
  626.   }
  627.   else return(0);
  628. }
  629.  
  630. int do_descript(int: count, int: brackets)    // Print file description
  631. {                                             // with word-wrapping
  632.   int: i, pos, que;
  633.   string: temp_desc_line1, desc_line1, desc_line2;
  634.  
  635.   que := tag_queue_size()-1;
  636.  
  637.   if(que >= 0)
  638.     if(check_tag(count,que)=1)
  639.       finfo[count].tagged := ST_TAG;
  640.     else
  641.       finfo[count].tagged := " ";
  642.  
  643.   if(strlen(finfo[count].description) > DESCRIPT)
  644.   {
  645.     temp_desc_line1 := substr(finfo[count].description,1,DESCRIPT);
  646.     for(i:=DESCRIPT;i>0;i:=i-1)
  647.     {
  648.       if(temp_desc_line1[i] = ' ')
  649.       {
  650.         desc_line1 := substr(finfo[count].description,1, i-1);
  651.         desc_line2 := substr(finfo[count].description,i+1,79);
  652.         print(finfo[count].tagged+ST_COL_DESC+desc_line1);
  653.         if(count < MAX_LINES-4)
  654.         {
  655.           print("\n"+strpad(" ",32+COUNT_OFFSET+brackets,' '));
  656.           print(substr(desc_line2,1,DESCRIPT-(COUNT_OFFSET+(brackets))));
  657.           return (count+2);
  658.         }
  659.         return (count+1);
  660.       }
  661.     }
  662.   }
  663.   print(finfo[count].tagged+ST_COL_DESC+finfo[count].description);
  664.   return (count+1);
  665. }
  666.  
  667. void display_info(int: dmp_file, int: dat_file, long: dat_file_size)
  668. {
  669.   array [1..255] of long: page;
  670.   int: file_status, dat_rec_size, brackets;
  671.   int: count, pageno, done, i;
  672.   long: posn;                                   // Display file info
  673.   unsigned long: dmp_descript_length;
  674.   char: ff_flags;
  675.   string: temp_dmp, counter, dat_rec, tag_char;
  676.   struct _stamp: ul_date;
  677.  
  678.   read(dat_file,dat_rec,32);
  679.   dat_rec_size := dat_rec[14];
  680.  
  681.   pageno := 1;
  682.   done := 0;
  683.   page[pageno] := 0;
  684.  
  685.   seek(dat_file,0,SEEK_SET);
  686.   while(done = 0)
  687.   {
  688.     posn := 0;
  689.     count := 1;
  690.     for(i:=1;i<MAX_LINES;i:=i+1)
  691.     {
  692.       finfo[i].fname := "";
  693.       finfo[i].size  := "";
  694.       finfo[i].date  := "";
  695.       finfo[i].description := "";
  696.       finfo[i].tagged := " ";
  697.     }
  698.     print(AVATAR_CLS);
  699.     while(count < (MAX_LINES-3) AND read(dat_file,dat_rec,dat_rec_size))
  700.     {
  701.       posn := posn +dat_rec_size;
  702.       page[pageno+1] := seek(dat_file,page[pageno]+posn,SEEK_SET);
  703.       finfo[count].fname := substr(dat_rec,1,stridx(dat_rec,1,0x00)-1);
  704.       ff_flags := dat_rec[15];
  705.       if(ff_flags & FF_OFFLINE)
  706.       {
  707.         finfo[count].size := str_st_file_offline1;
  708.         finfo[count].date := "";
  709.       }
  710.       else
  711.       {
  712.         finfo[count].size := strpadleft(ultostr(hextoul(dat_rec,35)),7,' ');
  713.         bit_date_to_stamp(hextoul(dat_rec,27),ul_date);
  714.         finfo[count].date := substr(stamp_string(ul_date),1,9);
  715.       }
  716.       seek(dmp_file,hextoul(dat_rec,43),SEEK_SET);
  717.       read(dmp_file,temp_dmp,2);
  718.       dmp_descript_length := hextoui(temp_dmp,1);
  719.       read(dmp_file,temp_dmp,dmp_descript_length);
  720.       if (COUNT_OFFSET > 0)
  721.       {
  722.         counter := ST_COUNT_LBRACKET+strpadleft(ltostr(hextoul(dat_rec,23)),
  723.                    COUNT_OFFSET,' ')+ ST_COUNT_RBRACKET;
  724.         brackets := 3;
  725.       }
  726.       finfo[count].description := counter+temp_dmp;
  727.       low_light(count);
  728.       count := do_descript(count,brackets);
  729.     }
  730.     pageno := pageno +1;
  731.     if(page[pageno] >= dat_file_size AND count < MAX_LINES-3)
  732.       print(str_st_end_filelist);
  733.     while(count < MAX_LINES-4)
  734.     {
  735.       print("\n");
  736.       count := count +1;
  737.     }
  738.     do_footer();
  739.     count := 1;
  740.     high_light(count);
  741.     done := get_input(page[pageno],pageno,count,dat_file_size);
  742.     if(page[pageno] = 0)
  743.       seek(dat_file,0,SEEK_SET);
  744.     else
  745.       seek(dat_file,page[pageno]-dat_rec_size,SEEK_SET);
  746.   }
  747. }
  748.  
  749. void read_files()
  750. {
  751.   int:    dmp_file, dat_file;
  752.   long:   dat_file_size;
  753.  
  754.   if (fopen(dmp_file, dat_file, dat_file_size))
  755.   {
  756.  
  757. #ifdef DO_LOG                               // Read *.DAT/*.DMP, if not
  758.                                             // exist, use internal max
  759.     log("S"+str_st_log_no_dat);             // file_titles routine
  760.  
  761. #endif
  762.  
  763.     menu_cmd(502,"");
  764.     return;
  765.   }
  766.   display_info(dmp_file, dat_file, dat_file_size);
  767.   close(dat_file);
  768.   close(dmp_file);
  769. }
  770.  
  771. void main()
  772. {
  773.   char: hotkeys;
  774.  
  775.   init_lang_starbar();                   // initiate language file
  776.  
  777.   hotkeys := usr.hotkeys;
  778.   if(usr.hotkeys = 0)                    // set hotkeys to ON
  779.     menu_cmd(615,"");
  780.   while(usr.def_proto = PROTOCOL_NONE)   // Protocol needed
  781.     menu_cmd(618,"");
  782.   if((usr.video=1 OR usr.video=2) AND (strfind(usr.xkeys, KEY) = False))
  783.   {
  784. #ifdef DO_LOG
  785.     log("S"+str_st_log_using_sb);
  786. #endif
  787.     read_files();
  788. #ifdef DO_LOG
  789.     log("S"+str_st_log_success);
  790. #endif
  791.   }
  792.   else
  793.   {
  794. #ifdef DO_LOG
  795.     log("S"+str_st_log_using_ft);
  796. #endif
  797.     menu_cmd(502,"");
  798.   }
  799.   usr.hotkeys := hotkeys;
  800.   print(AVATAR_CLS);
  801. }
  802.  
  803.  
  804.  
  805.  
  806.  
  807.  
  808.